from django import http

# Create your views here.
from random import randint
from django.views import View
from django_redis import get_redis_connection

from celery_tasks.sms.tasks import send_sms_code
# from celery_tasks.sms.yuntongxun import CCP

from meiduo_mall.libs.captcha.captcha import captcha
from meiduo_mall.utils.response_code import RETCODE

import logging

from verifications import constants

logger = logging.getLogger('django')


class ImageCodeView(View):
     def get(self,request,uuid):
         # 前端路径：this.host + "/image_codes/" + this.uuid + "/";
         # 使用SDK 生成图形验证码
         # name:是唯一标识，text：图形验证码的字符内容；
         # image_bytes 图片byte数据类型；
         name, text,image_bytes = captcha.generate_captcha()
         # 使用redis连接对象
         redis_conn = get_redis_connection('verify_code')
         # 把图形验证码字符内容存储到redis
         # 存储为字符串：setex key seconds value；
         redis_conn.setex(uuid, 300, text)
         # 响应
         return http.HttpResponse(image_bytes, content_type='image/jpg')


class SMSCodeView(View):
    # 短信验证类
    # var url = this.host + '/sms_codes/' + this.mobile + '/?image_code=' + this.image_code + '&uuid=' + this.uuid;
    def get(self, request, mobile):
        redis_conn = get_redis_connection('verify_code')
        # 检验手机号码是否已经存在了，如果在未失效的世界内不允许重新获取；
        send_flag = redis_conn.get('send_flag_%s' % mobile)
        if send_flag:
            return http.JsonResponse({"code": RETCODE.THROTTLINGERR, "errmsg": "频繁发送短信"})
        # 提取前端的请求参数:image_code为验证码内容，uuid为当前唯一标识，在图形验证码生成时，就已经存入redis数据库中；
        image_code_client = request.GET.get('image_code')
        uuid = request.GET.get('uuid')
        # 校验这两个参数是否都有
        if all([image_code_client, uuid]) is False:
            return http.HttpResponseForbidden('缺少必传参数')

        # 提取redis中已经存在的这两个值;1)连接数据库，2）获取值；
        image_code_server = redis_conn.get(uuid)

        # 生成后删除：一次性使用,将前面的有效期给去除了；
        redis_conn.delete(uuid)

        # 判断图形验证码有没有过期
        if image_code_server is None:
            return http.JsonResponse({"code": RETCODE.IMAGECODEERR, 'errmsg': '图形验证码已过期'})

        # 判断前后端的数据是否相等
        if image_code_client.lower() != image_code_server.decode().lower():
            return http.JsonResponse({"code": RETCODE.IMAGECODEERR, 'errmsg': '图片验证码输入错误'})

        # 验证码校验通过后开始生成短信验证码：生成6位数验证码
        sms_code = "%06d" % randint(0, 999999)
        logger.info(sms_code)    #将信息打印到控制台

        # 创建管道功能：将多次的redis写入库中，为了避免每次都请求所以使用管道，提供效率
        # 将生成的短信验证码存储到redis
        # 创建Redis管道
        pl = redis_conn.pipeline()
        #  将Redis请求添加到队列
        pl.setex("sms_code_%s" % mobile, constants.SMS_CODE_EXPIRE_REDIS, sms_code)
        # 此处将发送过手机号码的存储到redis数据库作标记
        pl.setex('send_flag_%s' % mobile, constants.SEND_FLAG_ECPIPE_REDIS, 1)
        # 执行
        pl.execute()

        # 利用第三方容联云发短信
        # CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_EXPIRE_REDIS//60], 1)
        # 此处实现异步任务，并将异步任务加入仓库中
        send_sms_code.delay(mobile, sms_code)

        # 响应返回
        return http.JsonResponse({"code": RETCODE.OK, "errmsg": "OK"})







